home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / bbs / diebox19 / read.c < prev    next >
Text File  |  1992-10-14  |  21KB  |  946 lines

  1. /*                            read.c    */
  2. #define                   VERSION "1.2"
  3. /*                       DL6HAZ Jul. 1992
  4. *
  5. */
  6.  
  7. /*--------------------------------------------------------------------
  8.  DL1BDY 13.10.92   : Anpassung an DIEBOX 1.9
  9.                     - Pfade für B und C jetzt unterhalb des BACKUP-DIR
  10.             - Einführung einer weiteren Env-Var "BACK_DIR"
  11.                     - Beim EXPORT aus B oder C wird in das EXPORT-File
  12.                       jeweils der originale Filename eingetragen. Somit
  13.                       ist ein einfacherer Rücktransfer in INFO-Boards
  14.                       möglich.
  15. -----------------------------------------------------------------------
  16.  
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <time.h>
  21. #include <fcntl.h>
  22. #include <ctype.h>
  23. #include <string.h>
  24. #include <io.h>
  25.  
  26.  
  27. /*  #define KEYB */      /* Read-Program stdout/stdin, man. Eing. von Binfilename*/
  28. /*#define LIST */      /* List-Program stdout nicht mit KEYB o. READ verw. */
  29.   #define READ        /* Export- oder ReadProgram  abhaengig von KEYB */
  30. /*#define DEBUG*/
  31.  
  32. #ifdef LIST
  33.   #undef KEYB
  34.   #undef READ
  35. #endif
  36.  
  37. #define IDXLENGTH 115
  38. #define BoxNullTime 536454000L         /*01.01.87*/
  39.  
  40. char *GetMsg();
  41. char *lcase();
  42. char *upcase();
  43. char *getenv();
  44. unsigned long absLDat();
  45. unsigned long absDat();
  46. extern int atoi();
  47. extern long atol();
  48.  
  49.  
  50. extern long timezone = 0l;
  51. extern int daylight = 0;
  52. extern int _fmode;
  53. extern unsigned _stklen;
  54.  
  55. char MultiBuff[10000];
  56. unsigned crctab[256];
  57. int FileCount = 0;
  58. long glob_bytecount =0;
  59. int err_count = 0;
  60.  
  61.  
  62. main(argc, argv)
  63. int argc;
  64. char *argv[];
  65. {
  66. int von, bis;
  67. int priv;
  68. int plus;
  69. time_t LastLogin;
  70. unsigned char searchstr[IDXLENGTH+1];
  71. char filename[IDXLENGTH+1];
  72. char Language[5];
  73. char *ptr;
  74.  
  75. int i=1;
  76. extern int optind;
  77. extern char *optarg;
  78.  
  79. /* Defaultwerte einstellen */
  80. von = 0;
  81. bis = 0;
  82. searchstr[0] = '*';                /* any string matches */
  83. searchstr[1] = '\0';
  84. *filename = '\0';
  85. time(&LastLogin);
  86. sprintf(Language, "%s", getenv("DEFAULT_LANG"));
  87. priv = 1;
  88. plus = 1;   /* Ausgabe mit vollen  Header */
  89.  
  90. #ifdef KEYB
  91.   plus = 0; /* Ausgabe mit verkuerzten Header */
  92. #endif
  93.  
  94. /*      Program Header ausgeben */
  95. #ifndef KEYB
  96. #ifdef READ
  97.   fprintf(stdout, "                              EXPMSG\n");
  98. #endif
  99. #endif
  100.  
  101. #ifdef LIST
  102.  fprintf(stdout, "                               LIST\n");
  103. #endif
  104.  
  105. #ifdef KEYB
  106. #ifdef READ
  107.   fprintf(stdout, "                               READ\n");
  108. #endif
  109. #endif
  110.  
  111. fprintf(stdout, "                            Version %s\n", VERSION);
  112. fprintf(stdout, "                            %s\n\n", __DATE__);
  113. #ifndef KEYB
  114. #ifdef READ
  115.   fprintf(stdout, "                 Export-Utilitie for THEBOX 1.9\n");
  116.   fprintf(stdout, "                     for Text- or BinFiles!\n");
  117.   fprintf(stdout, "          For HELP call EXPMSG without any Arguments!\n");
  118. #endif
  119. #endif
  120.  
  121.  
  122. /* filename bestimmen */
  123. if(argv[i] != NULL){
  124.   sprintf(filename, "%s", argv[i]);
  125.   #ifdef DEBUG
  126.      fprintf(stderr, "\nFilename: %s\n", filename);
  127.   #endif
  128. }
  129. else{
  130.     help();
  131.     exit(1);
  132. }
  133.  
  134.  
  135. memset(MultiBuff, '\0', sizeof(MultiBuff));
  136. for(i = 2; argv[i] != NULL; i++)
  137.     strcat(MultiBuff, argv[i]);
  138.  
  139. #ifdef DEBUG
  140. fprintf(stderr, "Commandline: %s\n", MultiBuff);
  141. #endif
  142.  
  143. if((ptr = strchr(MultiBuff, '!')) != NULL){
  144.    *ptr = '\0';
  145.    sscanf(ptr+1, "%s", searchstr);
  146.    upcase(searchstr);
  147.    von = 1;
  148.    bis = 9999;
  149. }
  150. if((ptr = strchr(MultiBuff, '-')) != NULL){
  151.     *ptr = '\040';
  152.     if(*(ptr+1) != '\0'){
  153.          sscanf(ptr+1, "%d", &bis);
  154.          von = 1;
  155.         }
  156.     if(&MultiBuff[0] != ptr){
  157.             sscanf(MultiBuff, "%d", &von);
  158.         if(bis == 0) bis = 9999;
  159.     }
  160. }
  161. else
  162.    if(isdigit(MultiBuff[0])){
  163.       sscanf(MultiBuff, "%d", &von);
  164.       bis = von;
  165. }
  166.  
  167. #ifdef DEBUG
  168.  fprintf(stderr, "\nvon %d bis %d searchstr %s\n", von, bis, searchstr);
  169. #endif
  170.  
  171. #ifndef KEYB
  172. #ifdef READ
  173.   fprintf(stdout, "\n\nExport: %s %d - %d !%s\n", filename,
  174.                           von,
  175.                           bis,
  176.                           searchstr);
  177. #endif
  178. #endif
  179.  
  180. init_crctab();
  181.  
  182. if((*filename == '\0') || ((strlen(filename)<2)&&(!priv))){
  183.     printf("%s\n", GetMsg(8, Language));
  184.     exit(1);
  185. }
  186. else
  187.    ReadRoutine(filename, von, bis, searchstr, plus , Language, LastLogin);
  188. #ifdef READ
  189. #ifndef KEYB
  190.    fprintf(stdout,
  191.      "\n\nExport OK!\nMsg: %d  Bytes: %ld  Errors: %d\n\n",
  192.                               FileCount,
  193.                               glob_bytecount,
  194.                               err_count);
  195. #endif
  196. #endif
  197. }
  198.  
  199.  
  200.  
  201. ReadRoutine(Filename, Von, Bis, Betreff, PlusFound, Lang, LastLogin)
  202. char *Filename;
  203. int Von;
  204. int Bis;
  205. unsigned char *Betreff;
  206. int PlusFound;
  207. char *Lang;
  208. time_t LastLogin;
  209. {
  210.   unsigned int Last,i;
  211.   char DName[IDXLENGTH+1];
  212.   int found;
  213.   int pnmatch();
  214.   char ChanStr[80];
  215.   char ReadDir[80];
  216.   long LastPos;
  217.   time_t ProtTime;
  218.  
  219.   struct tm *utc;
  220.  
  221.    FILE *Prot_fp;
  222.    FILE *List_fp;
  223.    FILE *Read_fp;
  224.  
  225. /*------------ ergänzt von DL1BDY, 13.10.92 ------------------------ */
  226.  
  227.  if ((strncmp(Filename, "B",1) == 0) || (strncmp(Filename, "b",1) == 0) ||
  228.      (strncmp(Filename, "C",1) == 0) || (strncmp(Filename, "c",1) == 0))
  229.  {
  230.    sprintf(ReadDir, "%s%s", getenv("BACK_DIR"), Filename);
  231. /*     sprintf(ReadDir, "D:\\BACKUP\\%s\\", Filename);  */
  232.  }
  233. /* -------------------- bis hier --------------------- */
  234.  
  235.  else
  236.  {
  237.    if(isCall(Filename))
  238.       sprintf(ReadDir, "%s%s", getenv("USR_DIR"), Filename);
  239.    else
  240.       sprintf(ReadDir, "%s%s", getenv("INFO_DIR"), Filename);
  241.  }
  242.  
  243.  sprintf(ChanStr, "%s\\protfile.dat", ReadDir);
  244.  if((Prot_fp = fopen(ChanStr, "r")) != NULL){
  245.     fseek(Prot_fp, 0L, 2);
  246.     LastPos = ftell(Prot_fp);
  247.  }
  248.  else{
  249.       fprintf(stdout, "%s %s\n", GetMsg(10, Lang), Filename);
  250.       exit(1);
  251.  }
  252.  Last = (int)(LastPos / (long)(IDXLENGTH));
  253.  
  254.  if (Bis > Last) Bis = Last;
  255.  
  256.  
  257.  if((Von == 0) && (Bis == 0)){
  258.    if (Last > 0){
  259.      found = 0;
  260.      fseek(Prot_fp,0l, 0);
  261.      for(i=1;(i<=Last) && (! found);i++){
  262.         fgets(DName, IDXLENGTH+1, Prot_fp);
  263.         DName[27] = '\0';
  264.         if(strchr((DName+13), '.') != NULL )
  265.           ProtTime = absLDat(DName+13);    /* Umrechnug Boxtime nach sec */
  266.         else
  267.       sscanf(DName+13, "%X", &ProtTime);
  268.         if(ProtTime > LastLogin) found = 1;
  269.      }
  270.      if (found){
  271.        Von = i-1;
  272.        Bis = Last;
  273.      }
  274.      else{
  275.        fprintf(stdout, "%s\n\n", GetMsg(58, Lang));
  276.        if(isCall(Filename))
  277.       printf("Userfile %s:\n", upcase(Filename));
  278.        else
  279.      printf("Infofile %s:\n", upcase(Filename));
  280.        fprintf(stdout, "%s\n\n", GetMsg(5, Lang));
  281.        utc = gmtime(&ProtTime);
  282.        printf("%4d %6.6s %02d.%02d.%02d %02d:%02d %6.6s %40.40s\n",
  283.                                   Last,
  284.                                                      DName+6,
  285.                               utc->tm_mday,
  286.                                  utc->tm_mon+1,
  287.                                   utc->tm_year,
  288.                               utc->tm_hour,
  289.                                utc->tm_min,
  290.                                   DName+28,
  291.                                   DName+35);
  292.      exit(0);
  293.      }
  294.   }
  295.  }  /* if von = 0 && bis = 0 */
  296.  
  297.  #ifdef DEBUG
  298.   fprintf(stderr, "\nvon %d bis %d\n", Von, Bis);
  299.  #endif
  300.  
  301.  if (Von <= Bis)
  302.  {
  303.     #ifdef LIST
  304.      List_fp = stdout;
  305.     #endif
  306.  
  307.     #ifdef READ
  308.     #ifndef KEYB
  309.       mkdir(Filename);
  310.       sprintf(ChanStr, "%s\\list.exp", Filename);
  311.       List_fp = fopen(ChanStr, "w");
  312.     #endif
  313.     #endif
  314.  
  315.     #ifndef KEYB
  316.       if(isCall(Filename))
  317.          fprintf(List_fp, "Userfile %s:\n", upcase(Filename));
  318.       else
  319.          fprintf(List_fp, "Infofile %s:\n", upcase(Filename));
  320.       fprintf(List_fp, "%s\n\n", GetMsg(5, Lang));
  321.     #endif
  322.  
  323. for(i = Von; i <= Bis; i++){
  324.     LastPos = (long)(IDXLENGTH) * (long)(i-1);
  325.     fseek(Prot_fp, LastPos, 0);
  326.     if(fgets(DName, IDXLENGTH, Prot_fp)== NULL) break;
  327.  
  328.     if (pnmatch(DName,Betreff, 1) == 1){
  329.      #ifndef KEYB
  330.         DName[27] = '\0';
  331.         if(strchr((DName+13), '.') != NULL )
  332.             ProtTime = absLDat(DName+13);    /* Umrechnug Boxtime nach sec */
  333.         utc = gmtime(&ProtTime);
  334.         fprintf(List_fp,
  335.                "%4d %6.6s %02d.%02d.%02d %02d:%02d %6.6s %40.40s\n",
  336.                                      i,
  337.                                                      DName+6,
  338.                               utc->tm_mday,
  339.                                  utc->tm_mon+1,
  340.                                   utc->tm_year,
  341.                               utc->tm_hour,
  342.                                utc->tm_min,
  343.                                   DName+28,
  344.                                   DName+35);
  345.      #endif
  346.     #ifdef READ
  347.        FileCount++;
  348.        DName[6]='\0';
  349.        sprintf(ChanStr, "%s\\%s", ReadDir, DName);
  350.        #ifdef DEBUG
  351.           fprintf(stderr, "%s\n", ChanStr);
  352.        #endif
  353.        if((Read_fp= fopen(ChanStr, "rb"))  != NULL){
  354.            setvbuf(Read_fp, NULL, _IOFBF, 10240);
  355.            ReadMsg(Read_fp, PlusFound, Lang, Filename, i);
  356.            glob_bytecount += ftell(Read_fp);
  357.                fclose(Read_fp);
  358.         }
  359.        else{
  360.            printf("%s\n", GetMsg(8, Lang));
  361.            err_count++;
  362.          }
  363.        #endif
  364.     }
  365.    } /* for i... */
  366. }
  367. fclose(Prot_fp);
  368. #ifdef READ
  369. #ifndef KEYB
  370.   fclose(List_fp);
  371. #endif
  372. #endif
  373. }
  374.  
  375.  
  376. int isCall(Call)
  377. char *Call;
  378. {
  379.  int ok;
  380.  int length;
  381.  int count;
  382.  char *uc;
  383.  
  384.  length = strlen(Call);
  385.  
  386.  /*printf("Laenge ");*/
  387.  if((length > 2) && (length < 7))
  388.  ok = 1;
  389.  else ok = 0;
  390.  
  391.  if(Call[0] > 0x7F) ok = 0;
  392.  
  393.  if(ok == 1)
  394.  {
  395.   /*printf("Zahlen 2+3 ");*/
  396.   if((isdigit(*(Call +1))) || (isdigit(*(Call +2)))) ok = 1;
  397.   else ok = 0;
  398.  }
  399.  
  400.  if(ok == 1)
  401.  {
  402.   /*printf("Letztes keine Zahl ");*/
  403.   if(!isdigit(*(Call + length -1))) ok = 1;
  404.   else ok = 0;
  405.  }
  406.  
  407.  if(ok == 1)
  408.  {
  409.   /*printf("Suffix-Length ");*/
  410.   uc = Call + length ;
  411.   count = 0;
  412.  
  413.   do
  414.   {
  415.    uc -= 1;
  416.    count++;
  417.   }
  418.   while((count < 5) && (isdigit(*uc) == 0));
  419.  
  420.   if(count < 5) ok = 1;
  421.   else ok = 0;
  422.  }
  423.  
  424.  if(ok == 1)
  425.  {
  426.   /*printf("Zahlen 1+2 ");*/
  427.   uc = Call;
  428.   if((isdigit(*uc++))&&(isdigit(*uc))) ok = 0;
  429.   else ok = 1;
  430.  }
  431.  
  432.  return(ok);
  433. }
  434.  
  435.  
  436.  
  437.  
  438. int Schaltjahr(Jahr)
  439. unsigned int Jahr;
  440. {
  441.  if(Jahr % 4 == 0 && Jahr % 100 != 0 || Jahr % 400 == 0) return(1);
  442.  return(0);
  443. }
  444.  
  445. unsigned int absTime(CharPtr)
  446. unsigned char *CharPtr;
  447. {
  448.  char StrStunde[3];
  449.  char StrMinute[3];
  450.  int  Stunde,Minute;
  451.  
  452.  sprintf(StrStunde,"%2.2s",CharPtr+ 9);
  453.  sprintf(StrMinute,"%2.2s",CharPtr+12);
  454.  sscanf(StrStunde,"%d",&Stunde);
  455.  sscanf(StrMinute,"%d",&Minute);
  456.  return((Stunde*60) + Minute);
  457.  
  458. }
  459.  
  460. unsigned long absDat(CharPtr)
  461. unsigned char *CharPtr;
  462. {
  463.  char Tag[3];
  464.  char Monat[3];
  465.  char Jahr[3];
  466.  unsigned long  NumTag;
  467.  unsigned long  NumJahr;
  468.  unsigned long  NumMonat;
  469.  unsigned long  result;
  470.  unsigned int   Mon;
  471.       int   i;
  472.  
  473.  sprintf(Tag,"%2.2s",CharPtr);
  474.  sprintf(Monat,"%2.2s",CharPtr + 3);
  475.  sprintf(Jahr,"%2.2s",CharPtr + 6);
  476.  
  477.  sscanf(Tag,"%ld",&NumTag);
  478.  sscanf(Monat,"%ld",&NumMonat);
  479.  sscanf(Jahr,"%ld",&NumJahr);
  480.  NumJahr += 1900;
  481.  
  482.  for (i=1987,result=0L;i<NumJahr;i++)
  483.  {
  484.   if(Schaltjahr(i)) result += 366;
  485.   else result += 365;
  486.  }
  487.  
  488.  for(i=1;i<NumMonat;i++)
  489.  {
  490.   switch(i)
  491.   {
  492.    case  1:
  493.    case  3:
  494.    case  5:
  495.    case  7:
  496.    case  8:
  497.    case 10:
  498.    case 12: Mon = 31;
  499.          break;
  500.    case  2: if(Schaltjahr((unsigned int)NumJahr)) Mon = 29; else Mon = 28;
  501.            break;
  502.    default: Mon = 30;
  503.          break;
  504.   }
  505.   result += Mon;
  506.  }
  507.  
  508.  result  += NumTag;
  509.  
  510.  return(result - 1);
  511. }
  512.  
  513. unsigned long absLDat(String)
  514. char *String;
  515. {
  516.   unsigned long retval;
  517.  
  518.   retval = absDat(String);/* Tage                 */
  519.   retval *= 1440;         /* Minuten              */
  520.               /* Stunden noch dazu    */
  521.   retval += (absTime(String));
  522.   retval = retval*60+BoxNullTime+3600;
  523.   return(retval);
  524. }
  525.  
  526.  
  527.  
  528. /*
  529.  * Convert a string to upper case.
  530.  */
  531. char *
  532. upcase(s)
  533. char *s;
  534. {
  535.     register char *p, c;
  536.  
  537.     for(p = s; c = *p; p++)
  538.         if((c >= 'a') && (c <= 'z'))
  539.             *p = c + 'A' - 'a';
  540.     return(s);
  541. }
  542.  
  543.  
  544.  
  545.  
  546. /*
  547.  * Convert a string to lower case.
  548.  */
  549. char *
  550. lcase(s)
  551. char *s;
  552. {
  553.     register char *p, c;
  554.  
  555.     for(p = s; c = *p; p++)
  556.         if((c >= 'A') && (c <= 'Z'))
  557.             *p = c + 'a' - 'A';
  558.     return(s);
  559. }
  560.  
  561.  
  562. ReadMsg(Read_fp, PlusFound, Lang, ExName, count)
  563. FILE *Read_fp;
  564. int PlusFound;
  565. char *Lang;
  566. char *ExName;
  567. int count;
  568. {
  569. int i = 0;
  570. static int status = 0;
  571. char HeadLine[100];
  572. char Titel[100];
  573. char ChanStr[100];
  574. char BoxSName[10];
  575. char BullID[20];
  576. char ZielMB[20];
  577. char *ptr1;
  578. char *ptr2;
  579.  
  580. FILE *ex_fp;
  581.  
  582.  
  583.   fseek(Read_fp, 3l, 0);
  584.   fgets(HeadLine, 100, Read_fp);
  585.   sscanf(HeadLine, "%8s", BoxSName);
  586.   #ifdef DEBUG
  587.     fprintf(stderr, "BoxSName %s ExName %s\n", BoxSName, ExName);
  588.   #endif
  589.   sscanf(HeadLine+strlen(BoxSName), "%12s", ZielMB);
  590.   if((ptr1 = strchr(ZielMB, '.')) != NULL) *ptr1 = '\0';
  591.   if(strncmp(BoxSName, ExName, 8) != 0)  *ZielMB = '\0';
  592.   fgets(Titel, 100, Read_fp);
  593.  
  594.   if(PlusFound){
  595.  
  596.     sprintf(ChanStr, "%s\\export.txt", ExName);
  597.     if(status == 0){
  598.     ex_fp = fopen(ChanStr, "wb");
  599.     status++;
  600.     }
  601.     else{
  602.         if((ex_fp = fopen(ChanStr, "ab")) == NULL){
  603.         perror("ReadMsg(): ex_fp");
  604.     exit(1);
  605.     }
  606.         fseek(ex_fp, 0l, 2);
  607.     }
  608.  
  609. /* -------DL1BDY 13.10.92
  610.    Bei Export aus "B" oder "C" wird der originale Rubrikname gesetzt.
  611.    Grund: Mails aus "B" oder "C" bekommt man nur wieder in die CHECK-
  612.    Liste, wenn man exportiert und anschliessend in die Original-Rubrik
  613.    importiert.
  614.   --------------------------------------------------------------- */
  615.     if ( (strncmp(ExName,"B",1) == 0) || (strncmp(ExName, "C",1) == 0 ))
  616.        ExName = BoxSName ;
  617.  
  618.     fprintf(ex_fp, "S %s %s < %.6s",
  619.                      ExName,
  620.                      ZielMB,
  621.                      HeadLine+20);
  622.     fgets(ChanStr, 80, Read_fp);
  623.     if(strncmp(ChanStr, "*** Bulletin-ID:",16) == 0){
  624.          sscanf(ChanStr+16, "%13s", BullID);
  625.      fprintf(ex_fp, " $%s", BullID);
  626.  
  627.     }
  628.     fgets(ChanStr, 80, Read_fp);  /* Rcv from */
  629.     if(isdigit(HeadLine[43]))
  630.          fprintf(ex_fp, " #%.3s", HeadLine+43);
  631.     sprintf(MultiBuff,
  632.         "R:%-2.2s%-2.2s%-2.2s/%-2.2s%-2.2sz @%-6.6s [%s]",
  633.          HeadLine+33,
  634.          HeadLine+30,
  635.          HeadLine+27,
  636.          HeadLine+36,
  637.          HeadLine+39,
  638.          getenv("OWNBBS"),
  639.          GetMsg(14, Lang)
  640.         );
  641.     fprintf(ex_fp, "\r\n%s", Titel);
  642.     fprintf(ex_fp, "%s", MultiBuff);
  643.     get_text(Read_fp, ex_fp, ExName, count);
  644.     fclose(ex_fp);
  645.   }
  646.   else{
  647.      fputs(HeadLine, stdout);
  648.      fputs(Titel, stdout);
  649.      fgets(ChanStr, 80, Read_fp);
  650.      fputs(ChanStr, stdout);
  651.      fgets(ChanStr, 80, Read_fp);
  652.      fgets(ChanStr, 80, Read_fp);
  653.  
  654.      fgets(MultiBuff, 90, Read_fp);
  655.      if(strncmp(MultiBuff, "R:", 2) == 0){
  656.          fprintf(stdout, "\n");
  657.          while(strncmp(MultiBuff, "R:", 2) == 0){
  658.          ptr1 = strchr(MultiBuff, '@');
  659.  
  660.          while(!isalnum(*ptr1++));
  661.          ptr1--;
  662.          ptr2 = ptr1;
  663.          while(isalnum(*ptr2++));
  664.          *(ptr2-1) = '\0';
  665.              sprintf(ChanStr, "%s%-12.12s %-6.6s", i?", ":"\0",
  666.                            MultiBuff+2,
  667.                                                ptr1);
  668.              fputs(ChanStr, stdout);
  669.              i++;
  670.              if( i == 3){
  671.               i = 0;
  672.                   fputc('\n', stdout);
  673.              }
  674.              fgets(MultiBuff, 100, Read_fp);
  675.          }
  676.          fprintf(stdout, "\n");
  677.     }
  678.     else
  679.     fputc('\n', stdout);
  680.  
  681.  
  682.    fputs(MultiBuff, stdout);
  683.    get_text(Read_fp, stdout, ExName, count);
  684.  
  685.   } /* else */
  686. }
  687.  
  688.  
  689.  
  690.  
  691.  
  692. char *GetMsg(MsgNo, Lang)
  693. int MsgNo;
  694. char *Lang;
  695. {
  696. int i;
  697.  
  698. char Filename[80];
  699. static char msg[255];
  700.  
  701. FILE *stream;
  702.  
  703. sprintf(Filename, "%s/msg%s.box", getenv("MBSYS_DIR"), Lang);
  704. stream = fopen(Filename, "r");
  705. if(stream != NULL){
  706.   for (i = 1; (fgets(msg, 255, stream) != NULL)&&(i != MsgNo); i++);
  707.   fclose(stream);
  708.   *(msg+strlen(msg)-1) = '\0';
  709.   return (&msg[0]);
  710. }
  711. return NULL;
  712. }
  713.  
  714.  
  715. help()
  716. {
  717.   fprintf(stdout, "\n\nSyntax: \n\n");
  718.   fprintf(stdout, "<Call/Rubrik> <von/bis/!searchstr>\n\n");
  719.   #ifndef KEYB
  720.   #ifdef READ
  721.     fprintf(stdout, "Die exportierten Nachrichten werden in Directory abglegt\n");
  722.     fprintf(stdout, "der dem Call bzw. der Rubrik entspricht.\n\n");
  723.     fprintf(stdout, "In diesem Directory befinden sich weiterhin:\n\n");
  724.     fprintf(stdout, "EXPORT.TXT - der Text.\n");
  725.     fprintf(stdout, "LIST.EXP   - wie der List-Befehl.\n");
  726.     fprintf(stdout, "#.bin      - die evt. Bin-Files, # entspricht der Nummer,\n");
  727.     fprintf(stdout, "             der entsprechend, Nachricht.\n\n");
  728.   #endif
  729.   #endif
  730.   exit(0);
  731. }
  732.  
  733. /* heisst nur pnmatch() weil es in einer Coh-Version eine derartige Fkt. */
  734. /* gibt. Hat ansonsten damit nichts zutun! */
  735. pnmatch(DName, Searchstr)
  736. char *DName;
  737. char *Searchstr;
  738. {
  739. char Protzeile[IDXLENGTH+1];
  740.  
  741. sprintf(Protzeile, "%s", DName);
  742. upcase(Protzeile);
  743. if(*Searchstr == '*')
  744.                 return 1;
  745. if(strstr(Protzeile, Searchstr) == NULL)
  746.    return 0;
  747. else
  748.    return 1;
  749. }
  750.  
  751.  
  752. get_text(Read_fp, exp_fp, ExName, count)
  753. FILE *Read_fp;
  754. FILE *exp_fp;
  755. char *ExName;
  756. int count;
  757. {
  758.  int i;
  759.  int BinFound = 0;
  760.  int BinFlag = 0;
  761.  
  762.  unsigned BoxCRC = 0;
  763.  unsigned crc = 0;
  764.  unsigned get_bin();
  765.  
  766.  long ReadPos;
  767.  long BinBytes = 0;
  768.  
  769.  char StartBin[] = "\n#BIN#";
  770.  char BinBuff[100];
  771.  char BinFilename[80];
  772.  char *ptr;
  773.  
  774.  FILE *bin_fp;
  775.  
  776.  
  777.  memset(BinBuff, '\0', sizeof(BinBuff));
  778.  for(; (BinBuff[BinFound] = fgetc(Read_fp)) != -1; ){
  779.  
  780.        if(BinBuff[BinFound] == '\n' || BinFound > 0){
  781.            if(BinBuff[BinFound] == StartBin[BinFound]){
  782.           BinFound++;
  783.           BinBuff[BinFound] = '\0';
  784.        }
  785.            else
  786.           BinFound = 0;
  787.         }
  788.  
  789.  
  790.  
  791.     if(BinFound == 6){
  792.     ReadPos = ftell(Read_fp);
  793.         #ifdef DEBUG
  794.       fprintf(stderr, "\n*** Bin found ***\n");
  795.       fprintf(stderr, "%ld\n", ReadPos);
  796.     #endif
  797.  
  798.         for( ;
  799.          ((BinBuff[BinFound]=fgetc(Read_fp)) != '\r') && (BinFound < 99);
  800.              BinFound++)
  801.          if(BinBuff[BinFound] == '#') BinBuff[BinFound] = '\040';
  802.  
  803.     *(BinBuff+BinFound+1) = '\0';
  804.  
  805.         if(BinBuff[BinFound] == '\r'){
  806.               if((ptr=strchr(BinBuff+6, '|')) != NULL)
  807.                         BoxCRC = atoi(ptr+1);
  808.               BinBytes = atol(BinBuff+6);
  809.     }
  810.     if(BinBytes != 0 && BoxCRC != 0){ /* Success ist BIN */
  811.         BinFlag = 1;
  812.                 #ifdef KEYB
  813.                    fprintf(stderr,
  814.              "Please enter filename for binary export: ");
  815.                    fgets(BinFilename, 70, stdin);
  816.            if(*BinFilename == '\n')
  817.                break;
  818.                     else
  819.               *(BinFilename+strlen(BinFilename)-1) = '\0';
  820.         #else
  821.            sprintf(BinFilename, "%s\\%d.bin", ExName, count);
  822.                    fprintf(exp_fp, "\n#BIN##%d.bin\r\n", count);
  823.                 #endif
  824.  
  825.                  fprintf(stderr, "\n#BIN#%ld#|%u#%s\n", BinBytes,
  826.                                 BoxCRC,
  827.                                 BinFilename);
  828.          if((bin_fp = fopen(BinFilename, "wb")) == NULL){
  829.                perror("Opening Binfilename");
  830.                err_count++;
  831.                        break;
  832.          }
  833.                  crc = get_bin(BinBytes, Read_fp, bin_fp);
  834.          fprintf(stderr, "\n#OK#\n");
  835.          fprintf(stderr, "Export-CRC: %u/%u\n\n", BoxCRC, crc);
  836.          if(BoxCRC != crc){
  837.                      err_count++;
  838.                  }
  839.          fclose(bin_fp);
  840.          break;
  841.       }
  842.       else{             /* Failure war doch kein BIN */
  843.          BinFound = 0;
  844.          BinBuff[5] = '\0';
  845.          fseek(Read_fp, ReadPos, 0);
  846.          }
  847.        }
  848.  
  849.        if(BinFound == 0){
  850.               for(i =0; BinBuff[i] != '\0'; i++)
  851.                       fputc(BinBuff[i], exp_fp);
  852.        memset(BinBuff, '\0', sizeof(BinBuff));
  853.        }
  854.  
  855.  }
  856. if(BinFlag == 0){
  857.    for(i =0; BinBuff[i] > 0; i++){
  858.                       fputc(BinBuff[i], exp_fp);
  859.    }
  860.    fprintf(exp_fp,"***END\r\n");
  861. }
  862.  
  863. }
  864.  
  865.  
  866.  
  867.  
  868. /*
  869.  *   CCITT Polynom x^16 + x^12 + x^5 + 1
  870.  *
  871.  *   hier im Gegensatz zu CCITT, (A)X.25:
  872.  *     - Datenbyte MSB zuerst
  873.  *     - CRC-Start mit 0
  874.  *     - keine Multiplikation Nachricht mit x^16
  875.  *       (CRC wird bei Empfang nicht ueber CRC-Bytes berechnet)
  876.  *     - kein Invertieren des CRC
  877.  *
  878.  *   wird z.B. benutzt von:  UoSat DCE, SEVEN
  879.  */
  880.  
  881. /*unsigned crctab[256];
  882. unsigned crc;
  883. unsigned byte; */       /* Datenbyte, high Byte = 0 ! */
  884.  
  885.  
  886.  
  887. /*
  888.  *   entweder beim Programmstart einmal aufrufen,
  889.  *   oder die 512 Byte Tabelle einmal ausrechnen lassen und dann als
  890.  *   initialisierte Tabelle ins Programm uebernehmen
  891.  */
  892.  
  893. init_crctab()
  894.   {
  895.     unsigned n;
  896.     unsigned m;
  897.     unsigned r;
  898.     unsigned mask;
  899.  
  900.     static unsigned bitrmdrs[] = { 0x9188,0x48C4,0x2462,0x1231,
  901.                                    0x8108,0x4084,0x2042,0x1021  };
  902.  
  903.     for (n = 0; n < 256; ++n)
  904.       {
  905.         for (mask = 0x0080, r = 0, m = 0; m < 8; ++m, mask >>= 1)
  906.           if (n & mask) r = bitrmdrs[m] ^ r;
  907. /*
  908.  *       "if (n & mask) r ^= bitrmdrs[m];"  ist kuerzer, aber Turbo C fuer
  909.  *       den Atari ST, Version 1.0, uebersetzt das falsch
  910.  */
  911.         crctab[n] = r;
  912.       }
  913.   }
  914.  
  915.  
  916.  
  917. /*
  918.  *   byteweiser Algorithmus, C, portabel
  919.  */
  920. /*
  921. void do_crc(void)
  922.   {
  923.     crc = crctab[crc >> 8] ^ (crc << 8 | byte);
  924.   }
  925. */
  926.  
  927.  
  928. unsigned get_bin(Bytecount, Read_fp, bin_fp)
  929. long Bytecount;
  930. FILE *Read_fp;
  931. FILE *bin_fp;
  932. {
  933.  unsigned crc = 0;
  934.  unsigned byte;
  935.  long i;
  936.  
  937.  
  938.  for(i = 0; i < Bytecount && (byte = fgetc(Read_fp)) != -1; i++){
  939.     crc = crctab[crc >> 8] ^ (crc << 8 | byte);
  940.     fputc(byte, bin_fp);
  941.  }
  942.  return crc;
  943. }
  944.  
  945.  
  946.